package com.usj.dcalvo.ecommerce.dao.impl;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.usj.dcalvo.ecommerce.bean.UsuarioBean;
import com.usj.dcalvo.ecommerce.dao.IUsuarioDAO;

@Repository
public class UsuarioDaoImpl implements IUsuarioDAO {

	// SessionFactory lo inyecto con spring
	private SessionFactory sessionFactory;

	@Override
	public void addUser(UsuarioBean usuario) {
		// this.sessionFactory.getCurrentSession().save(usuario);
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		session.save(usuario);
		session.getTransaction().commit();
		session.close();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<UsuarioBean> getAllUsers() {
		return this.sessionFactory.getCurrentSession()
				.createQuery("from UsuarioBean").list();
	}

	@Override
	public void deleteUser(Integer userId) {
		UsuarioBean user = (UsuarioBean) sessionFactory.getCurrentSession()
				.load(UsuarioBean.class, userId);
		if (null != user) {
			this.sessionFactory.getCurrentSession().delete(user);
		}
	}

	@Transactional
	public UsuarioBean obtenerUsuarioPorMail(String email) {
		Criteria criteria = this.sessionFactory.getCurrentSession()
				.createCriteria(UsuarioBean.class)
				.add(Restrictions.eq("email", email));
		UsuarioBean object = (UsuarioBean) criteria.uniqueResult();
		return object;
	}

	@Override
	@Transactional
	public UsuarioBean getUsuarioPorId(Integer idUsuario) {
		Criteria criteria = this.sessionFactory.getCurrentSession()
				.createCriteria(UsuarioBean.class)
				.add(Restrictions.eq("id", idUsuario))
				.setFetchMode("usuario", FetchMode.JOIN);
		UsuarioBean object = (UsuarioBean) criteria.uniqueResult();
		return object;
	}

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
}
